iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

今天我們接著介紹另一種偵錯方式,WPP軟體追蹤

WPP軟體追蹤

WPP 軟體追蹤類似於使用 Windows 事件記錄服務,驅動程式會在記錄檔中記錄相關資訊,而後處理器會將記錄檔中的資訊轉換成人類可讀取的格式

在Non-Pnp driver sample中有定義trace.h供WPP軟體追蹤使用,我們會使用到tracepdbtracelogtracefmt這三個工具。上述三個工具在安裝WDK時就有一併安裝了,以我的編譯環境會位於C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64內。

  • 使用管理者權限開啟命令提示字元,切換到上述三個工具的目錄下,首先執行tracepdb,輸入的pdb檔為Non-Pnp driver編譯完成後所產生出的nonpnp.pdb,會產生出追蹤訊息格式(TMF)檔,提供追蹤訊息的格式設定。
    racepdb.exe -f <your nonpnp drvier sample loaction>\kmdf\sys\x64\Debug\nonpnp.pdb
    ``
    [](https://raw.githubusercontent.com/papa12804/pics/master/debug-11.png)
    
  • 接下來執行tracelog
    racelog -start MyTrace -guid #71ae54db-0862-41bf-a24f-5330cec3c7f6 -flag 7 -level 0xFFFF
    ``
    [](https://raw.githubusercontent.com/papa12804/pics/master/debug-8.png)
    下我們簡單介紹傳入的參數:
     `-start`,啟動追蹤會話,名稱為後方的`MyTrace`。
     `-guid`為`trace.h`中所定義的GUID,如下方所示:
    ```c
    #define WPP_CONTROL_GUIDS                                            \
    	WPP_DEFINE_CONTROL_GUID( FileIoTraceGuid,                        \
    							 (71ae54db,0862,41bf,a24f,5330cec3c7f6), \
    							 WPP_DEFINE_BIT(DBG_INIT)     \
    							 WPP_DEFINE_BIT(DBG_RW)       \
    							 WPP_DEFINE_BIT(DBG_IOCTL)    \
    							 )
    
      - 可以參考[WPP_CONTROL_GUIDS](https://learn.microsoft.com/zh-tw/previous-versions/windows/hardware/previsioning-framework/ff556186(v=vs.85))的說明。
      - `FileIoTraceGuid`為**GUIDFriendlyName**,
      - 這裡的GUID格式與一般常見由32個16進位數字所組成的GUID有所不同,稱為**ControlGUID**。一共有五個欄位,以逗號分隔,並使用括弧括住。
      - `WPP_DEFINE_BIT`會定義**追蹤旗標**,最多可以定義 31 個追蹤旗標,由bit 0開始遞增。
    
    • -flag
      • 當啟動追蹤會話時,會記錄所指定追蹤旗標的追蹤訊息
    • -level
      • 使用TraceEvents時會傳入追蹤層級,當啟動追蹤會話時,會記錄所指定追蹤層級的追蹤訊息,而追蹤層級定義在Evntrace.h中。下方TRACE_LEVEL_VERBOSE即為追蹤層級。
        TraceEvents(TRACE_LEVEL_VERBOSE, DBG_INIT,
                        "Driver Frameworks NONPNP Legacy Driver Example");
        ``
        
  • 接著開啟另外一個命令提示字元並執行之前Non-Pnp driver的測試程式,執行成功後回到原本的命令提示字元輸入下方指令,停止tracelog。停止tracelog後會產生出記錄檔,由於沒有指定記錄檔位置及名稱,預設會儲存在當前目錄下並命名為LogFile.Etl
    racelog -stop MyTrace
    ``
    [](https://raw.githubusercontent.com/papa12804/pics/master/debug-9.png)
    
  • 然後使用tracefmt,將LogFile.Etl轉換為人類可讀的檔案。
    racefmt LogFile.Etl -p . -o nonpnp.out
    ``
     `-p`,指定TMF檔的路徑,由`tracepdb`所產生。
     `-o`,指定輸出檔案的名稱,這裡設定為`nonpnp.out`。
    [](https://raw.githubusercontent.com/papa12804/pics/master/debug-10.png)
    
  • 使用編輯器打開nonpnp.out,就可以看到執行Non-PnP driver測試程式時驅動程式所丟出來的偵錯訊息。

結論

WPP軟體追蹤可記錄系統識別碼、時間戳和內建的其他資料類型,我們也可以自行定義所需要的資料類型,相當有彈性,Windows驅動程式範例中有許多範例都使用了WPP軟體追蹤來偵錯。

參考內容

Tracedrv - README
Tracepdb
Tracelog
Tracefmt
TMF


上一篇
Day09 如何偵錯驅動程式-1
下一篇
Day11 使用I/O存取環控晶片-1
系列文
Windows Driver + Electron 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言